题目: 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是依照递增排序的。
解法:
-
双指针法:
用两个指针指向两个链表不断比较大小并连接,
需要记录返回合并后链表的当前节点,比较麻烦 -
递归法
每次判断头节点(值小的),和尾部合并好的节点(明显的递归特诊)
递归代码:
#include "pch.h"
#include<iostream>
using namespace std;
struct ListNode {
int value;
ListNode* next;
};
ListNode* MergeSortedList(ListNode* node1,ListNode* node2) {
if (node1 == nullptr) return node2;
if (node2 == nullptr) return node1;
ListNode* res;
if (node1->value <= node2->value) res = node1;
else res = node2;
res->next = MergeSortedList(res->next, node1 == res ? node2 : node1);
return res;
}
int main()
{
ListNode* p1 = new ListNode();
p1->value = 4;
p1->next = nullptr;
ListNode* p2 = new ListNode();
p2->value = 2;
p2->next = p1;
ListNode* p3 = new ListNode();
p3->value = 3;
//p3->next = p2;
ListNode* p4 = new ListNode();
p4->value = 1;
p4->next = p3;
ListNode* t = MergeSortedList(p4,p2);
cout << t->value;
}
7行代码解决
防御性:
- 一个或两个空链表输入
- 链表有环(有可能需要考虑的点)
如果题目说不包含环的就无需考虑