Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.

  题目意思很简单,就是合并两个有序链表,头需要是原先的两个链表中的一个。这道题在本科生的数据结构书上就有讲,原理就就是:两个链表A,B分别逐个遍历,判断两个元素的大小,取小的作为新链表的下一个节点。让小学生做,他们也能知道原理,但是这里我是用python写的,调试了好久才得到结果,主要的原因就出在python本身的机制上。先贴代码,再细说:

# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None class Solution:
# @param two ListNodes
# @return a ListNode
def mergeTwoLists(self, l1, l2):
p1 = l1
p2 = l2
if l1 == None:
return l2
if l2 == None:
return l1
if l1.val < l2.val:
#print 'choose:1'
h = ListNode(l1.val)
hm = h
while(p1.next != None and p2 != None):
#print p1.val,p2.val
if p1.next.val > p2.val:
tempnode = ListNode(p2.val) #注意,此处需要注意,不要使用赋值语句,使用赋值语句你就完了!
h.next = tempnode
h = tempnode
p2 = p2.next
else:
tempnode = ListNode(p1.next.val)
h.next = tempnode
h = h.next
p1 = p1.next
print h.val
if p1.next == None: #l1遍历完了
h.next = p2
else:
h.next = p1.next
return hm
else:
#print 'choose:2'
h = ListNode(l2.val)
hm = h
while(p1 != None and p2.next != None):
if p2.next.val > p1.val:
tempnode = ListNode(p1.val)
h.next = tempnode
h = tempnode
p1 = p1.next
else:
tempnode = ListNode(p2.next.val)
h.next = tempnode
h = h.next
p2 = p2.next
print h.val
if p1 == None: #l1遍历完了
h.next = p2.next
else:
h.next = p1
return hm

  最主要的问题就出在新链表h的构建问题上,起初,我用的不是:

      tempnode = ListNode(p2.val)
h.next = tempnode
h = tempnode

  而是使用的:

      h.next = p1.next
h = h.next

  这就造成了一个指针的混乱,原因就出在python的拷贝机制上。python的拷贝机制有三种,例子如下:

import copy
a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用
c = copy.copy(a) #对象拷贝,浅拷贝
d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a
a[4].append('c') #修改对象a中的['a', 'b']数组对象
b.append(1) print 'a = ', a
print 'b = ', b
print 'c = ', c
print 'd = ', d 结果如下:
a = [1, 2, 3, 4, ['a', 'b', 'c'], 5, 1]
b = [1, 2, 3, 4, ['a', 'b', 'c'], 5, 1]
c = [1, 2, 3, 4, ['a', 'b', 'c']]
d = [1, 2, 3, 4, ['a', 'b']]

  我之前所用的复制方式,就是采用的第一种,将新链表和P1关联起来,这样,一旦h发生改变之后,p1也发生了改变。造成了指针的混乱,所以我这次采用的方式是:对于新链表,每次要添加一个元素的时候,就新建一个节点,把要添加的元素的值赋值给它,这样就不会发生混乱了。

【leetcode】Merge Two Sorted Lists的更多相关文章

  1. 【leetcode】Merge k Sorted Lists

    Merge k Sorted Lists Merge k sorted linked lists and return it as one sorted list. Analyze and descr ...

  2. 【leetcode】Merge Two Sorted Lists(easy)

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  3. 【leetcode】Merge k Sorted Lists(按大小顺序连接k个链表)

    题目:Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity ...

  4. 【LeetCode】Merge Two Sorted Lists(合并两个有序链表)

    这道题是LeetCode里的第21道题. 题目描述: 将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 示例: 输入:1->2->4, 1-&g ...

  5. 【Leetcode】【Hard】Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解 ...

  6. 【Leetcode】【Easy】Merge Two Sorted Lists .

    Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...

  7. 【LeeCode23】Merge k Sorted Lists★★★

    1.题目描述: 2.解题思路: 题意:将K个已经排序的链表合并成一个排序的链表,分析并描述所用算法的复杂度. 方法一:基于“二分”思想的归并排序.本文用非递归和递归两种方法实现. (1)非递归:归并排 ...

  8. 【LeetCode21】Merge Two Sorted Lists★

    1.题目描述: 2.解题思路: 本题是要合并两个已经有序的单链表,思路很简单,有两种方法:非递归和递归. 3.Java代码: (1)非递归: 为方便操作,定义一个辅助的头节点,然后比较原来两个链表的头 ...

  9. 【LeetCode-easy】Merge Two Sorted Lists

    思路:指针p用于串联怎个链表,比较两个指针的大小,连接较小的一个.如果一个链表到达链尾,连接另外一个链表余下来的所以节点. public ListNode mergeTwoLists(ListNode ...

随机推荐

  1. Splinter学习--初探3,两种方式登录QQ邮箱

    目前,qq邮箱的登录方式有: 1.利用账号.密码登录 2.快捷登录,前提是你本地已有qq账号登录中 和前面一样,还是先到qq邮箱登录首页,审查页面元素,找到我们进行登录操作所相关的链接.按钮或是输入框 ...

  2. UILabel添加图片之富文本的简单应用

    若想对UILabel添加图片,那么就需要使用NSMutableAttributedString来定义先定义一个普通的label UILabel *lab = [[UILabel alloc]initW ...

  3. json 数据 添加 删除 排序

    js数据格式和json数据格式,各有各的用处,就个人而言,json更好用一点,js自身的数组和对像限制比较多. 以js的数组举例: var a = ['1']; a[5] = 52; a.length ...

  4. vim符号列表窗口

    有时使用vim开发时,需要能够直观的查看文件的符号列表或者变量list,但是vim不直接支持这个功能,需要使用ctags的插件支持. 以下是在ubuntu下的详细设置方法: 步骤1:安装ctags u ...

  5. php特性包括哪些?

    PHP的特性包括: 1. PHP 独特的语法混合了 C.Java.Perl 以及 PHP 自创新的语法. 2. PHP可以比CGI或者Perl更快速的执行动态网页——动态页面方面,与其他的编程语言相比 ...

  6. 关于MYSQL四种引擎

    你能用的数据库引擎取决于mysql在安装的时候是如何被编译的.要添加一个新的引擎,就必须重新编译MYSQL.在缺省情况下,MYSQL支持三个引擎:ISAM.MYISAM和HEAP.另外两种类型INNO ...

  7. SVN的服务器端用户权限配置

    第一:用户的配置 SVN和apache整合的话,用户可以直接使用htpasswd dav_svn.passwd_file_address USERNAME来配置. 而账户的管理可以用dav_svn.a ...

  8. Oracle学习指南

    Oracle学习指南 你走的那天,我决定不落泪,迎着风撑着眼帘用力不眨眼 创建数据库.创建用户.创建表空间.创建表.插入数据..... 1.用系统用户登录,任选系统用户 代码: >>sql ...

  9. S2SH简介

    struts2简介 Struts2是由WebWork基础上发展起来的,与struts1比较,选用struts2的理由是:①Struts1要求Action类继承一个抽象基类,而Struts 2 Acti ...

  10. redis cluster节点管理测试

    ####redis v3.2.0###添加节点:1.添加master节点 170 ./redis-trib.rb add-node 127.0.0.1:7007 127.0.0.1:7001 171 ...