Leetcode 21. 合并两个有序链表
21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)

思路1 递归:
1.首先判断两个链表中是否有空链表,如果有则返回另一个。如果都是空,则返回那个都可以了。
2.然后比较两个节点的值,如果list1的值小于list2的值,则list1的下一个节点和list2继续比较,反之则从list2的下一个节点开始比较
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
if list1==nil {
return list2
}
if list2==nil{
return list1
}
if list1.Val<list2.Val{
list1.Next=mergeTwoLists(list1.Next,list2)
return list1
}else{
list2.Next=mergeTwoLists(list1,list2.Next)
return list2
}
}
思路2 迭代:
1.创建一个新节点resNode,再把这个节点的地址赋值给另一个新节点res。
2.当list1和list2两个链表都不为空的时候,遍历这两个链表。
3.比较两个链表当前节点的大小,把小的节点地址赋给resNode,再把对应的链表的节点指向到下一个。resNode也指向下一个。
4.当两个链表其中一个已经遍历完成,则把另一个链表的后续节点接到resNode上。
5.通过res记录的resNode最初的位置,返回合并后的第一个节点。
func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
resNode := new(ListNode)
res := resNode
for list1 != nil && list2 != nil {
if list1.Val < list2.Val {
resNode.Next = list1
list1 = list1.Next
resNode = resNode.Next
} else {
resNode.Next = list2
list2 = list2.Next
resNode = resNode.Next
}
}
if list1 == nil {
resNode.Next = list2
} else {
resNode.Next = list1
}
return res.Next
}

浙公网安备 33010602011771号