21. 合并两个有序链表

113 阅读1分钟

Problem: 21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

思路1:循环迭代

思路类似快排的两个while循环合并有序序列,判断首位大小即可

Code

func mergeTwoLists(list1 *ListNode, list2 *ListNode) *ListNode {
	node := &ListNode{Val: 0}
	list := node
	for list1 != nil && list2 != nil {
		if list1.Val <= list2.Val {
			node.Next = list1
            node = node.Next
			list1 = list1.Next
		}else if  list2.Val <= list1.Val {
			node.Next = list2
            node = node.Next
			list2 = list2.Next
		}
	}
    if list1 == nil {
			node.Next = list2
		
		}
		if list2 == nil {
			node.Next = list1
		}
	return list.Next
}

思路二:递归 递归三步曲:

  1. 先确定入参、出参的意义
    • 入参,两个list。出参:已经有序的一个list
  2. 确定终止条件
    • 当其中一个list为空的时候,就可以直接终止递归
  3. 确定递归体
    • 确定了出参,这时候就要把整个递归当做一个整体,不要想递归之后再递归的事情
    • 当可以list.val小的指向 递归(不管后面调用,这个递归出参已经确定了,两个list合成的有序list),那么这样 这个原list也会变成一个有序的list
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(list2, list1.Next)
      return list1
   } else {
      list2.Next = mergeTwoLists(list1, list2.Next)
      return list2
   }
}