21. 合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
题意
将两个有序列表合并
思路
用两个指针分别指向两个链表最开始,每次把较小的拿出来,相应指针后移,直到一个链表为空,把另一个链表接到确定链表的后面。
代码
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
auto dummy = new ListNode(-1), tail = dummy;
while(list1 && list2){
if(list1->val < list2->val){
tail = tail->next = list1;
list1 = list1->next;
}else{
tail = tail->next = list2;
list2 = list2->next;
}
}
if(list1) tail->next = list1;
if(list2) tail->next = list2;
return dummy->next;
}
};
2. 两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
题意
用两个链表中存的值表示两个数(逆序),求两个数相加,结果以链表的形式表示。
思路
用t表示进位,如果l1或者l2或者存在进位,则把对应位相加,每次得到的值放入新的链表中,进位t/=10。
代码
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
auto dummy = new ListNode(-1), tail = dummy;
int t = 0;
while(l1 || l2 || t){
if(l1) t += l1->val, l1 = l1->next;
if(l2) t += l2->val, l2 = l2->next;
tail = tail->next = new ListNode(t % 10);
t /= 10;
}
return dummy->next;
}
};
19. 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
题意
删除链表中的倒数第n个个节点
思路
先把链表总长度求出来,然后遍历找到倒数第n+1个节点(遍历n-k-1次),修该其指针指向倒数第n-1个节点
代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
auto dummy = new ListNode(-1);
dummy->next = head;
int s = 0;
for(auto i = dummy; i; i = i->next) s++;
auto p = dummy;
for(auto i = 0; i < s- n - 1; i++) p = p->next;
p->next = p->next->next;
return dummy->next;
}
};