2016-04-08 19 views
-3

私はデータ構造を学び、Pythonでマージリンクリストを実行しています。しかし、私はいくつかの混乱する問題に直面します。ノードの定義は次の関数、パラメータL1およびL2においてこれらの2つのコードセグメントの違いは何ですか。

class ListNode: 
    def __init__(self, x): 
     self.val = x 
     self.next = None 

がマージされるlinklistsであり、関数がマージLINKLISTを返すべきです。

最初の実装は以下の通りである:

def merge(l1, l2): 
    if l1 == None: 
     return l2 
    if l2 == None: 
     return l1 
    p = l1 
    q = l2 
    if l1.val < l2.val: 
     l = l1 
    else: 
     l = l2 
    start = l 
    while p and q: 
     if p.val < q.val: 
      l.next = p 
      p = p.next 
     else: 
      l.next = q 
      q = q.next 
     l = l.next 
    if p!= None: 
     l.next = p 
    if q!=None: 
     l.next = q 
    return start 

しかし、これは動作していない、それはループに入ったとき、L1は、その値であり、無限linkelistなるので、すべての0次の実装は、この問題が発生することはありませんでしたので、 :

def mergeTwoLists(self, l1, l2): 
    if l1 == None: 
     return l2 
    if l2 == None: 
     return l1 
    l = ListNode(0) 
    start = l 
    while l1 and l2: 
     if l1.val < l2.val: 
      l.next = l1 
      l1 = l1.next 
     else: 
      l.next = l2 
      l2 = l2.next 
     l = l.next 
    if l1!= None: 
     l.next = l1 
    if l2!=None: 
     l.next = l2 
    return start.next 

この2つのセグメントの違いは何ですか?どのようにしてl1は無限のリンクリストになりますか? また、別の質問もあります。変数 'l'は最初に 'start'に割り当てられ、各ループではlが次のノードに移動しますが、startには変更がありません。最後にマージされたリストを指しているのはなぜですか?どうして同じままにするのではなく、ちょうどlに等しいか?

誰かが私の質問に答えられることを願っています。どうもありがとうございました。

+0

l1とl2は何ですか?あなたはそれらのリストを呼び出しますが、 'val'メソッドと' next'メソッドがあるようです。それらは何をするのですか? –

+0

@DanielRosemanマージするリンクリストです。ノードの定義を追加して、より明確にしました。ありがとう。 – BiuBiuBiu

答えて

0

l1.val < l2.valとすると、l = l1とする。 p = l1q = l2の場合はp.val < q.valなので、l.next = pです。つまり、l.nextl1であり、これはlです。ノードが自身を指しています。 2番目の実装で新しいノードl = ListNode(0)から開始することで、この自己参照を避けることができます。

+0

次に、変数 'start'が2番目のアルゴリズムの最後に変更されるのはなぜですか?最初はlを指しているので、lと同じ値ではないでしょうか? – BiuBiuBiu

+0

'l'を別のものに変更したため、いいえ。 –

関連する問題