#coding: cp852

class Tlist_item:
  _DATA=None			# Pojemnik na dane.
  _NEXT=None			# Wska«nik nast©pnego elementu.

  def  __init__(self,D):
      '''Inicjacja z danymi.'''
      self._DATA=D
      self._NEXT=None

#---============================[ insert_in_order ]==========================================[]
  def insert_in_order(self,I,order=lambda x,y:x._DATA<y._DATA):
    '''Dodanie do listy tworzonej przez ci¥g element¢w listy pojedynczego elementu I w porz¥dku order.'''
    if order(self,I):								# I maby† wstawiony za aktualnym.
      if not self._NEXT:							# Nie ma nastepnych po aktualnym.
        self._NEXT=I								# I jest wstawiany jako nast©pny.
      else:									# Jest co˜ za aktualnym.
        self._NEXT=self._NEXT.insert_in_order(I,order)				# I jest wstawiany do "ogona".        
    else:									# I ma by† wstaliony przed ist© - lista ma by† wstawiona za I.
      I._NEXT=self								# Doˆacza list© do I.
      return I									# Zwraca nowa list©: I-old_list.
    return self									# Nie zwr¢ciˆ inaczej - zwraca siebie.
      
#------------------------------------ SHOW -------------------------------------------
#---============================[ show ]==========================================[]
  def show(self):
    '''Wy˜wietla list©.'''
    if not self._NEXT:								# Nie ma nast©pnika.
      print(f'[{self._DATA}]-|:.')						# Wypisuje w©zeˆ i zakoäczenie.
    else:									# Nast©pnik jest.
      print(f'[{self._DATA}]->',end='')						# Wypisuje w©zeˆ i wskazanie dalsze.
      self._NEXT.show()								# Wykonujwe wypisanie rekurencyjnie dla nast©pnych.
    

def insert_list_in_list_inOrder(L1,L2,order=lambda x,y:x._DATA<y._DATA):
  '''Wstawia list© L1 w list© L2 w porz¥dku wyznaczonym przez funkcj© order.'''
  if not L1: 									# Lista L1 jest  pusta.
    return L2									# Wynikiem jest caˆa lista L2.
  if not L2: 									# Lista L2 jest  pusta.
    return L1									# Wynikiem jest caˆa lista L1.

  while L2:									# Dop¢ki w li˜cie L2 jest jaki˜ element.
    L=L2                                                                    	# Odrywa pierwszy element listy, przez wskazanie go.
    L2=L2._NEXT     								# Przesuni©cie wska«nika listy na ogon.			
    L._NEXT=None									# I odci©cie od pierwszego elementu ogona.
    print('Wstawia L:',end='')
    L.show()
    L1=L1.insert_in_order(L,order)						# Doˆacza do L1 elemant I.
    L1.show()
  return L1									# Zwraca list©.


#---============================[ __name__ ]==========================================[]
if __name__=="__main__":
  L=[1,3,6,23,22,11,32,21,0,99]							# Dane do stworzenia listy.

  print('===  Lista LL ====')
  LL=None
  for l in L:
    print(f'Wstaw <{l}>')
    LL=insert_list_in_list_inOrder(LL,Tlist_item(l))
    print(': ',end='')
    LL.show()

  L=[7,13,16,123,122,111,132,121,10,199]					# Dane do stworzenia 2 listy.

  print('===  Lista LX ====')
  LX=None
  for l in L:
    print(f'Wstaw <{l}>')
    LX=insert_list_in_list_inOrder(LX,Tlist_item(l))
    print(': ',end='')
    LX.show()

  print('===  Poˆ¥czone listy LL i LX ====')
  LL=insert_list_in_list_inOrder(LL,LX)
  LL.show()
