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
}

  

  

 

posted @ 2022-04-21 12:00  SoutherLea  阅读(26)  评论(0编辑  收藏  举报