今日链表系列
2. 两数相加
关键变量就是carry,用来存进位数
思想:
- 构建一个新的链表又来存两数之和
- 从头开始遍历两个链表,判断节点是否存在,计算和,同时指针移动
- 在新链表构建新节点存和,并且更新进位值
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode* head = new ListNode(0);ListNode* cur = head;int carry = 0;while (l1 || l2 || carry){int sum = carry;if (l1){sum += l1->val;l1 = l1->next;}if (l2){sum += l2->val;l2 = l2->next;}cur->next = new ListNode(sum % 10);cur = cur->next;carry = sum / 10;}return head->next;}
19. 删除链表的倒数第n个节点
解法双指针:
思想:
添加虚拟头节点
首先一个指针f从头节点开始移动n次,此时,第二个指针s和f中就相差n-1个节点
然后二者同时开始移动,当f到最后一个节点时,s就在倒数第n+1个节点上
利用s删除第n个节点
class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* dummyHead = new ListNode(0,head);ListNode* f = dummyHead;ListNode* s = dummyHead;while (n--){f = f->next;}while (f->next){f = f->next;s = s->next;}s->next = s->next->next;return dummyHead->next;}
};
不使用虚拟头节点还需要避免指针访问空节点或者链表长度的问题,比如删除第一个节点或者最后一个节点的时候就很麻烦。
24. 两两交换节点
--javascripttypescriptshellbashsqljsonhtmlcssccppjavarubypythongorustmarkdown
ListNode* swapPairs(ListNode* head) {if (head == nullptr || head->next == nullptr) return head;ListNode* dummyHead = new ListNode(0, head);ListNode* pre = dummyHead;ListNode* cur = head;ListNode* pos = cur->next;while (cur && cur->next){ListNode* tmp = pos->next;pre->next = pos;cur->next = tmp;pos->next = cur;// 指针移动pre = cur;cur = tmp;if(tmp) pos = tmp->next;}return dummyHead->next;}