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 }