目录
21. Merge Two Sorted Lists

方法一迭代
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* head = nullptr;
ListNode* tail = nullptr;
while(list1 || list2){
ListNode *temp = nullptr;
if(list1 && list2){
if(list1->val >= list2->val){
temp = list2;
list2 = list2->next;
}else{
temp = list1;
list1 = list1->next;
}
}else if(list1){
temp = list1;
list1 = list1->next;
}else{
temp = list2;
list2 = list2->next;
}
if(head==nullptr){
head = temp;
tail = temp;
}else{
tail->next = temp;
tail = temp;
}
}
return head;
}
};
当至少有一个链表已经为空时,可以不用一个一个结点处理:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
ListNode* head = nullptr;
ListNode* tail = nullptr;
while(list1 && list2){
ListNode *temp = nullptr;
if(list1->val >= list2->val){
temp = list2;
list2 = list2->next;
}else{
temp = list1;
list1 = list1->next;
}
if(head==nullptr){
head = temp;
tail = temp;
}else{
tail->next = temp;
tail = temp;
}
}
if(head == nullptr){
head = (list1 != nullptr ? list1 : list2);
}else{
tail->next = (list1 != nullptr ? list1 : list2);
}
return head;
}
};
方法二递归法:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {
if(list1 == nullptr)
return list2;
if(list2 == nullptr)
return list1;
ListNode* head = nullptr;
if(list1->val >= list2->val){
list2->next = mergeTwoLists(list1,list2->next);
head = list2;
}else{
list1->next = mergeTwoLists(list1->next,list2);
head = list1;
}
return head;
}
};
2. Add Two Numbers


/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = new ListNode(-1,nullptr);
ListNode* tail = nullptr;
int up = 0;//进位
int sum = 0;
while(l1&&l2){
sum = up + l1->val + l2->val;
up = sum/10;
sum = sum%10;
ListNode* node = new ListNode(sum,nullptr);
if(tail == nullptr){
dummy->next = node;
tail = node;
}else{
tail->next = node;
tail = node;
}
l1 = l1->next;
l2 = l2->next;
}
while(l1){
sum = up + l1->val;
up = sum /10;
sum = sum%10;
ListNode* node = new ListNode(sum,nullptr);
if(tail == nullptr){
dummy->next = node;
tail = node;
}else{
tail->next = node;
tail = node;
}
l1 = l1->next;
}
while(l2){
sum = up + l2->val;
up = sum/10;
sum = sum%10;
ListNode* node = new ListNode(sum,nullptr);
if(tail == nullptr){
dummy->next = node;
tail = node;
}else{
tail->next = node;
tail = node;
}
l2 = l2->next;
}
while(up != 0){
ListNode* node = new ListNode(up%10,nullptr);
up = up/10;
if(tail == nullptr){
dummy->next = node;
tail = node;
}else{
tail->next = node;
tail = node;
}
}
ListNode* res = dummy->next;
delete dummy;
return res;
}
};


249

被折叠的 条评论
为什么被折叠?



