??前面的话??
大家好!本篇文章将介绍关于数据结构之链表的OJ题,来自力扣:21. 合并两个有序链表 或 剑指 Offer 25. 合并两个排序的链表 题解,展示代码语言暂时为:Java语言与C语言。(后续会更新C++代码)
📒博客主页:未见花闻的博客主页 🎉欢迎关注🔎点赞👍收藏??留言📝 📌本文由未见花闻原创,CSDN首发! 📆首发时间:🌴2021年11月30日🌴 ??坚持和努力一定能换来诗与远方! 💭刷题推荐书籍:📚《剑指offer专项版》,📚《剑指offer第2版》 💬参考在线编程网站:🌐牛客网🌐力扣 博主的码云gitee,平常博主写的程序代码都在里面。 博主的github,平常博主写的程序代码都在里面。 🙏作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
??剑指 Offer 25. 合并两个排序的链表??
🔐题目详情
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
提示: 两个链表的节点数目范围是
[
0
,
50
]
[0, 50]
[0,50]
?
100
<
=
N
o
d
e
.
v
a
l
<
=
100
-100 <= Node.val <= 100
?100<=Node.val<=100
l
1
l1
l1 和
l
2
l2
l2 均按 非递减顺序 排列
💡解题思路
方法1:构造一个头结点,遍历两链表,按数据域值大小按顺序尾插至头结点后。 步骤:
- 构造头结点
h
e
a
d
head
head。
- 两链表同时遍历,将较小值的链表先尾插至
h
e
a
d
head
head结点后(如果相等,随便一个结点尾插即可),结果返回head结点的后一个结点即可。
- 如果遍历过程中,有链表遍历完或者指针(引用)指向
n
u
l
l
null
null,结束遍历,直接将未遍历完的链表的剩余所有结点尾插至
h
e
a
d
head
head链表后面。
方法2:递归。 步骤: 假设有两个排好序的链表(升序)分别为
l
i
s
t
1
,
l
i
s
t
2
list1,list2
list1,list2,遍历时的引用(指针)分别为
c
u
r
1
,
c
u
r
2
cur1,cur2
cur1,cur2。
- 新建一个链表结点引用(指针)
c
u
r
cur
cur,递归函数为
m
e
r
g
e
T
w
o
L
i
s
t
s
(
s
t
r
u
c
t
L
i
s
t
N
o
d
e
?
l
i
s
t
1
,
s
t
r
u
c
t
L
i
s
t
N
o
d
e
?
l
i
s
t
2
)
mergeTwoLists(struct ListNode* list1, struct ListNode* list2)
mergeTwoLists(structListNode?list1,structListNode?list2),返回值为链表引用(指针)。
- 递归过程中,每次使
c
u
r
cur
cur指向较小结点
m
i
n
(
c
u
r
1
,
c
u
r
2
)
min(cur1,cur2)
min(cur1,cur2),函数返回
c
u
r
cur
cur。
- 如果cur1结点数据域的值较小,则
c
u
r
cur
cur的
n
e
x
t
next
next域指向
m
e
r
g
e
T
w
o
L
i
s
t
s
(
c
u
r
1.
n
e
x
t
,
c
u
r
2
)
mergeTwoLists(cur1.next,cur2)
mergeTwoLists(cur1.next,cur2),反之指向
m
e
r
g
e
T
w
o
L
i
s
t
s
(
c
u
r
1
,
c
u
r
2.
n
e
x
t
)
mergeTwoLists(cur1,cur2.next)
mergeTwoLists(cur1,cur2.next)。
- 递归条件为传入的结点是否为
n
u
l
l
null
null,如果为
n
u
l
l
null
null返回另一个结点地址。
🔑源代码
方法1:Java
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode newNode = new ListNode();
ListNode tmp = newNode;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
tmp.next = l1;
l1 = l1.next;
tmp = tmp.next;
}
else {
tmp.next = l2;
l2 = l2.next;
tmp = tmp.next;
}
}
if (l1 != null) {
tmp.next = l1;
}
if (l2 != null) {
tmp.next = l2;
}
return newNode.next;
}
}
方法2:C
struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){
if (!l1)
return l2;
if (!l2)
return l1;
struct ListNode* cur = NULL;
if (l1->val <= l2->val)
{
cur = l1;
cur->next = mergeTwoLists(l1->next, l2);
}
else
{
cur = l2;
cur->next = mergeTwoLists(l1, l2->next);
}
return cur;
}
🌱总结
抓住链表是已经排序好这一点,遍历比较两链表的值,将链表进行重排。
觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦!
|